#pragma once
#include "Global.h"
class HttpConnection : public std::enable_shared_from_this<HttpConnection> {
  friend class LogicSystem;

 public:
  HttpConnection(boost::asio::io_context& ioc);
  tcp::socket& GetSocket();

  void Start();  // 开始监听异步读事件

 private:
  void HandleReq();         // 处理客户端请求
  void WriteResponse();     // 回应客户端请求
  void CheckDeadline();     // 检测连接是否超时
  void PreParseGetParam();  // 解析get请求参数

 private:
  unsigned char FromHex(unsigned char x);
  std::string UrlDecode(const std::string& str);

 private:
  tcp::socket _socket;  // TCP套接字，用来与客户端通信
  beast::flat_buffer _buffer{1024 * 8};          // 接收数据缓冲区
  http::request<http::dynamic_body> _request;    // 客户端请求数据
  http::response<http::dynamic_body> _response;  // 回应客户端数据

  std::string _get_url;
  std::unordered_map<std::string, std::string> _get_params;
  // {...} 是初始化列表c++11引入的新机制
  // 用作定时器，判断请求是否超时

  // _deadline 的执行器与 _socket 的执行器绑定
  // 定时器触发为当前时间之后的 60 秒。
  net::steady_timer _deadline{_socket.get_executor(), std::chrono::seconds(60)};
};
